package com.dhcc.utils;

import java.util.Map;
import java.util.Vector;

import com.dhcc.utils.object.ObjectCopier;
import com.dhcc.utils.object.ObjectCopierGenerator;

/**
 * java.lang.Object 通用辅助类
 * 
 * @author hibean@qq.com 2017年7月1日
 *
 */
public class __Object {

	/**
	 * 复制的选项类型
	 * 
	 * @author hibean@qq.com 2017年7月1日
	 *
	 */
	public interface Options {
		/**
		 * 复制非空值
		 */
		public static int NOT_EMPTY = 1;

		/**
		 * 复制非null值
		 */
		public static int NOT_NULL = 2;

		/**
		 * 复制非空与非null值
		 */
		public static int NOT_NULL_OR_EMPTY = NOT_NULL | NOT_EMPTY;

		/**
		 * 复制非0值
		 */
		public static int NOT_ZERO = 4;

		/**
		 * 复制全部
		 */
		public static int ALL = 8;
	}

	private static final Vector<ObjectCopier> copiers = new Vector<ObjectCopier>();
	
	/**
	 * 根据源数据，设置目标属性
	 * 
	 * @param target
	 *            目标数据对象
	 * @param source
	 *            源数据对象
	 * @param fields
	 *            复制的列
	 */
	public static void set(Object target, Object source, String fields){
		set(target, source, fields, Options.ALL);
	}
	/**
	 * 根据源数据，设置目标属性
	 * 
	 * @param target
	 *            目标数据对象
	 * @param source
	 *            源数据对象
	 * @param fields
	 *            复制的列
	 * @param option
	 *            复制选项，请参见{@linkplain Options}，默认ALL
	 */
	private static void set(Object target, Object source, String fields,
			int option) {
		for (ObjectCopier copier : copiers) {
			if(copier.support(target, source, fields, option)){
				copier.copy(target, source);
				return;
			}
		}
		ObjectCopier copier = ObjectCopierGenerator.create(target, source, fields, option);
		copiers.add(copier);
		copier.copy(target, source);
	}
}
